<html>
    <head>
        <title>生成静态客户端代理</title>
    </head>
    <body>
        <script>
             /*
                        四、客户端代理生成   Client Proxy Generation


                                1、首先，将"Volo. Abp.Http.Client" nuget包添加到您的客户端项目中：(启动模板已经包含了此包)
                                
                                        "Install-Package Volo.Abp.Http.Client"

                                2、然后将AbpHttpClientModule依赖项添加到您的模块中：

                                                        [DependsOn(typeof(AbpHttpClientModule))] // 添加此模块依赖  (启动模板已经包含了此模块依赖)
                                                        public class MyClientAppModule : AbpModule
                                                        {
                                                        }


                                                    现在，它已准备好为静态客户端代理生成配置应用程序。


                                                    (1)、带有契约(contracts)定义示例:

                                                                [DependsOn(
                                                                    typeof(AbpHttpClientModule), //used to create client proxies
                                                                    typeof(AbpVirtualFileSystemModule) //virtual file system
                                                                )]
                                                                public class MyClientAppModule : AbpModule
                                                                {
                                                                    public override void ConfigureServices(ServiceConfigurationContext context)
                                                                    {
                                                                        //  添加生成静态客户端代理配置
                                                                        context.Services.AddStaticHttpClientProxies(
                                                                            typeof(MyClientAppModule).Assembly  // 当前客户端代理程序集包含契约的定义 (类、枚举、其他...)
                                                                        );

                                                                        // 将生成的 app-generate-proxy.json 文件包含到虚拟文件系统中
                                                                        Configure<AbpVirtualFileSystemOptions>(options =>
                                                                        {
                                                                            options.FileSets.AddEmbedded<MyClientAppModule>();
                                                                        });
                                                                    }
                                                                }


                                                        (2)、不带契约(contracts)定义示例:

                                                                [DependsOn(
                                                                    typeof(AbpHttpClientModule), //used to create client proxies
                                                                    typeof(AbpVirtualFileSystemModule), //virtual file system
                                                                    typeof(BookStoreApplicationContractsModule) // 依赖BookStoreApplicationContract模块的契约定义模块
                                                                )]
                                                                public class MyClientAppModule : AbpModule
                                                                {
                                                                    public override void ConfigureServices(ServiceConfigurationContext context)
                                                                    {
                                                                        // 添加生成静态客户端代理配置
                                                                        context.Services.AddStaticHttpClientProxies(
                                                                            typeof(BookStoreApplicationContractsModule).Assembly  // 服务契约来自从外部引用的程序集 (类、枚举、其他...)
                                                                        );

                                                                        // 将生成的 app-generate-proxy.json 文件包含到虚拟文件系统中
                                                                        Configure<AbpVirtualFileSystemOptions>(options =>
                                                                        {
                                                                            options.FileSets.AddEmbedded<MyClientAppModule>();
                                                                        });
                                                                    }
                                                                }


                                                    "AddStaticHttpClientProxies"方法获取一个程序集，查找给定程序集中的所有服务接口，并为静态客户端代理生成做准备。



                                                    备注：
                                                        应用程序启动模板在HttpApi.Client项目中为动态客户端代理生成预先配置。

                                                        如果要切换到静态客户端代理，请在HttpApi.Client项目的模块类中将context.Services.AddHttpClientProxies更改为context.Services.AddStaticHttpClientProxies。
                                                    
                                
                            
                                3、配置服务端点(端口)    在Configuration系统中配置服务端口

                                                    在 appsettings.json 文件中的 "RemoteServices"节点部分默认用于配置远程服务的端口。
                                                    
                                                    最简单的配置如下：

                                                                {
                                                                    "RemoteServices": {
                                                                        "Default": {
                                                                        "BaseUrl": "http://localhost:53929/"
                                                                        } 
                                                                    } 
                                                                }

                                                    有关详细配置，请参阅下面的AbpRemoteServiceOptions部分。


                                4、代码生成  

                                                    生成客户端代理代码时，服务器端必须启动并运行。    

                                                    因此，请在BaseUrl上运行为HTTP API提供服务的应用程序，该应用程序的配置如Endpoint Configuration部分中所述。

                                                    在客户端项目（.csproj）的根文件夹中打开命令行终端并键入以下命令：

                                                            (1)、With Contracts 包含契约定义：

                                                                           "abp generate-proxy -t csharp -u http://localhost:53929/"
                                                                           

                                                                    此命令应在ClientProxies文件夹下生成以下文件：

                                                                            ①、BookClientProxy.Generated.cs是本例中实际生成的代理类。
                                                                                
                                                                                        BookClientProxy是一个partial类*，您可以在其中编写自定义代码（ABP不会覆盖它）。

                                                                            ②、IBookAppService.cs是应用服务(接口)。

                                                                            ③、BookDto.cs是应用服务使用的Dto类。

                                                                            ④、app-generate-proxy.json包含有关远程HTTP端点的信息，以此文件作为依据，abp可以正确执行HTTP请求。
                                                                            
                                                                                        此文件必须配置为项目中的嵌入式资源，以便虚拟文件系统可以找到它。

                                                                    
                                                            (2)、Without Contracts 不包含契约定义：

                                                                            "abp generate-proxy -t csharp -u http://localhost:53929/ --without-contracts"

                                                                        此命令应在ClientProxies文件夹下生成以下文件：

                                                                              ①、BookClientProxy.Generated.cs 是本例中实际生成的代理类。

                                                                                            BookClientProxy是一个partial类，您可以在其中编写自定义代码（ABP不会覆盖它）。

                                                                              ②、app-generate-proxy.json包含有关远程HTTP端点的信息，以此文件作为依据，ABP可以正确执行HTTP请求。

                                                                                            此文件必须配置为项目中的嵌入式资源，以便虚拟文件系统可以找到它。


                                                        备注：

                                                                generate-proxy命令仅为您在应用程序中定义的API生成代理。

                                                                如果您正在开发模块化应用程序，您可以指定-m（或--module）参数来指定要生成代理的模块。

                                                                有关其他选项，请参阅ABP CLI留档中的Generate-proxy部分：https://abp.io/docs/latest/cli
                                                                
                     */
        </script>
    </body>
</html>